using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._AnalysisTools._Proximity
{
    /// <summary>
    /// <para>Multiple Ring Buffer</para>
    /// <para>Creates multiple buffers at specified distances around the input features. These buffers can optionally be merged and dissolved using the buffer distance values to create nonoverlapping buffers.</para>
    /// <para>在输入要素周围的指定距离处创建多个缓冲区。可以选择使用缓冲区距离值合并和溶解这些缓冲区，以创建不重叠的缓冲区。</para>
    /// </summary>    
    [DisplayName("Multiple Ring Buffer")]
    public class MultipleRingBuffer : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public MultipleRingBuffer()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_Input_Features">
        /// <para>Input Features</para>
        /// <para>The input point, line, or polygon features to be buffered.</para>
        /// <para>要缓冲的输入点、线或面要素。</para>
        /// </param>
        /// <param name="_Output_Feature_class">
        /// <para>Output Feature class</para>
        /// <para>The output feature class that will contain multiple buffers.</para>
        /// <para>将包含多个缓冲区的输出要素类。</para>
        /// </param>
        /// <param name="_Distances">
        /// <para>Distances</para>
        /// <para>The list of buffer distances.</para>
        /// <para>缓冲区距离的列表。</para>
        /// </param>
        public MultipleRingBuffer(object _Input_Features, object _Output_Feature_class, List<object> _Distances)
        {
            this._Input_Features = _Input_Features;
            this._Output_Feature_class = _Output_Feature_class;
            this._Distances = _Distances;
        }
        public override string ToolboxName => "Analysis Tools";

        public override string ToolName => "Multiple Ring Buffer";

        public override string CallName => "analysis.MultipleRingBuffer";

        public override List<string> AcceptEnvironments => ["MResolution", "MTolerance", "XYDomain", "XYResolution", "XYTolerance", "ZResolution", "ZTolerance", "extent", "geographicTransformations", "outputCoordinateSystem", "outputMFlag", "outputZFlag", "outputZValue", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_Input_Features, _Output_Feature_class, _Distances, _Buffer_Unit.GetGPValue(), _Field_Name, _Dissolve_Option.GetGPValue(), _Outside_Polygons_Only.GetGPValue()];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The input point, line, or polygon features to be buffered.</para>
        /// <para>要缓冲的输入点、线或面要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _Input_Features { get; set; }


        /// <summary>
        /// <para>Output Feature class</para>
        /// <para>The output feature class that will contain multiple buffers.</para>
        /// <para>将包含多个缓冲区的输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _Output_Feature_class { get; set; }


        /// <summary>
        /// <para>Distances</para>
        /// <para>The list of buffer distances.</para>
        /// <para>缓冲区距离的列表。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Distances")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public List<object> _Distances { get; set; }


        /// <summary>
        /// <para>Distance Unit</para>
        /// <para><xdoc>
        ///   <para>Specifies the linear unit that will be used with the distance values.</para>
        ///   <bulletList>
        ///     <bullet_item>Default—The linear unit of the input features' spatial reference will be used. If the Output Coordinate System geoprocessing environment has been set, the linear unit of the environment will be used. The linear unit is ignored if the input features have an unknown or undefined spatial reference. This is the default.</bullet_item><para/>
        ///     <bullet_item>Inches—The unit will be inches.</bullet_item><para/>
        ///     <bullet_item>Feet—The unit will be feet.</bullet_item><para/>
        ///     <bullet_item>Yards—The unit will be yards.</bullet_item><para/>
        ///     <bullet_item>Miles—The unit will be miles.</bullet_item><para/>
        ///     <bullet_item>Nautical miles—The unit will be nautical miles.</bullet_item><para/>
        ///     <bullet_item>Millimeters—The unit will be millimeters.</bullet_item><para/>
        ///     <bullet_item>Centimeters—The unit will be centimeters.</bullet_item><para/>
        ///     <bullet_item>Decimeters—The unit will be decimeters.</bullet_item><para/>
        ///     <bullet_item>Meters—The unit will be meters.</bullet_item><para/>
        ///     <bullet_item>Kilometers—The unit will be kilometers.</bullet_item><para/>
        ///     <bullet_item>Decimal degrees—The unit will be decimal degrees.</bullet_item><para/>
        ///     <bullet_item>Points—The unit will be points.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将与距离值一起使用的线性单位。</para>
        ///   <bulletList>
        ///     <bullet_item>默认 - 将使用输入要素空间参考的线性单位。如果已设置输出坐标系地理处理环境，则将使用环境的线性单位。如果输入要素具有未知或未定义的空间参考，则忽略线性单位。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>英寸—单位将为英寸。</bullet_item><para/>
        ///     <bullet_item>英尺—单位将为英尺。</bullet_item><para/>
        ///     <bullet_item>码—单位将为码。</bullet_item><para/>
        ///     <bullet_item>英里—单位将为英里。</bullet_item><para/>
        ///     <bullet_item>海里—单位将为海里。</bullet_item><para/>
        ///     <bullet_item>毫米—单位将为毫米。</bullet_item><para/>
        ///     <bullet_item>厘米—单位将为厘米。</bullet_item><para/>
        ///     <bullet_item>分米—单位将为分米。</bullet_item><para/>
        ///     <bullet_item>米—单位将为米。</bullet_item><para/>
        ///     <bullet_item>千米—单位将为千米。</bullet_item><para/>
        ///     <bullet_item>十进制度—单位为十进制度。</bullet_item><para/>
        ///     <bullet_item>点—单位将为点。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Distance Unit")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _Buffer_Unit_value _Buffer_Unit { get; set; } = _Buffer_Unit_value._Default;

        public enum _Buffer_Unit_value
        {
            /// <summary>
            /// <para>Default</para>
            /// <para>Default—The linear unit of the input features' spatial reference will be used. If the Output Coordinate System geoprocessing environment has been set, the linear unit of the environment will be used. The linear unit is ignored if the input features have an unknown or undefined spatial reference. This is the default.</para>
            /// <para>默认 - 将使用输入要素空间参考的线性单位。如果已设置输出坐标系地理处理环境，则将使用环境的线性单位。如果输入要素具有未知或未定义的空间参考，则忽略线性单位。这是默认设置。</para>
            /// </summary>
            [Description("Default")]
            [GPEnumValue("Default")]
            _Default,

            /// <summary>
            /// <para>Centimeters</para>
            /// <para>Centimeters—The unit will be centimeters.</para>
            /// <para>厘米—单位将为厘米。</para>
            /// </summary>
            [Description("Centimeters")]
            [GPEnumValue("Centimeters")]
            _Centimeters,

            /// <summary>
            /// <para>Decimal degrees</para>
            /// <para>Decimal degrees—The unit will be decimal degrees.</para>
            /// <para>十进制度—单位为十进制度。</para>
            /// </summary>
            [Description("Decimal degrees")]
            [GPEnumValue("DecimalDegrees")]
            _DecimalDegrees,

            /// <summary>
            /// <para>Feet</para>
            /// <para>Feet—The unit will be feet.</para>
            /// <para>英尺—单位将为英尺。</para>
            /// </summary>
            [Description("Feet")]
            [GPEnumValue("Feet")]
            _Feet,

            /// <summary>
            /// <para>Inches</para>
            /// <para>Inches—The unit will be inches.</para>
            /// <para>英寸—单位将为英寸。</para>
            /// </summary>
            [Description("Inches")]
            [GPEnumValue("Inches")]
            _Inches,

            /// <summary>
            /// <para>Kilometers</para>
            /// <para>Kilometers—The unit will be kilometers.</para>
            /// <para>千米—单位将为千米。</para>
            /// </summary>
            [Description("Kilometers")]
            [GPEnumValue("Kilometers")]
            _Kilometers,

            /// <summary>
            /// <para>Meters</para>
            /// <para>Meters—The unit will be meters.</para>
            /// <para>米—单位将为米。</para>
            /// </summary>
            [Description("Meters")]
            [GPEnumValue("Meters")]
            _Meters,

            /// <summary>
            /// <para>Miles</para>
            /// <para>Miles—The unit will be miles.</para>
            /// <para>英里—单位将为英里。</para>
            /// </summary>
            [Description("Miles")]
            [GPEnumValue("Miles")]
            _Miles,

            /// <summary>
            /// <para>Millimeters</para>
            /// <para>Millimeters—The unit will be millimeters.</para>
            /// <para>毫米—单位将为毫米。</para>
            /// </summary>
            [Description("Millimeters")]
            [GPEnumValue("Millimeters")]
            _Millimeters,

            /// <summary>
            /// <para>Nautical miles</para>
            /// <para>Nautical miles—The unit will be nautical miles.</para>
            /// <para>海里—单位将为海里。</para>
            /// </summary>
            [Description("Nautical miles")]
            [GPEnumValue("NauticalMiles")]
            _NauticalMiles,

            /// <summary>
            /// <para>Points</para>
            /// <para>Points—The unit will be points.</para>
            /// <para>点—单位将为点。</para>
            /// </summary>
            [Description("Points")]
            [GPEnumValue("Points")]
            _Points,

            /// <summary>
            /// <para>Yards</para>
            /// <para>Yards—The unit will be yards.</para>
            /// <para>码—单位将为码。</para>
            /// </summary>
            [Description("Yards")]
            [GPEnumValue("Yards")]
            _Yards,

            /// <summary>
            /// <para>Decimeters</para>
            /// <para>Decimeters—The unit will be decimeters.</para>
            /// <para>分米—单位将为分米。</para>
            /// </summary>
            [Description("Decimeters")]
            [GPEnumValue("Decimeters")]
            _Decimeters,

        }

        /// <summary>
        /// <para>Buffer Distance Field Name</para>
        /// <para>The name of the field in the output feature class that will store the buffer distance used to create each buffer feature. The default is distance. The field will be of type Double.</para>
        /// <para>输出要素类中字段的名称，用于存储用于创建每个缓冲区要素的缓冲区距离。默认值为 distance。该字段的类型为 Double。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Buffer Distance Field Name")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _Field_Name { get; set; } = null;


        /// <summary>
        /// <para>Dissolve Option</para>
        /// <para><xdoc>
        ///   <para>Specifies whether buffers will be dissolved to resemble rings around the input features.</para>
        ///   <bulletList>
        ///     <bullet_item>Non-overlapping (rings)—Buffers will be dissolved to resemble rings around the input features that do not overlap (think of these as rings or donuts around the input features). The smallest buffer will cover the area of its input feature plus the buffer distance, and subsequent buffers will be rings around the smallest buffer that do not cover the area of the input feature or smaller buffers. All buffers of the same distance will be dissolved into a single feature. This is the default.</bullet_item><para/>
        ///     <bullet_item>Overlapping (disks)—Buffers will not be dissolved. All buffer areas will be maintained regardless of overlap. Each buffer will cover its input feature plus the area of any smaller buffers.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否将缓冲区溶解为类似于输入要素周围的环。</para>
        ///   <bulletList>
        ///     <bullet_item>非重叠（环）—缓冲区将被溶解为类似于不重叠的输入要素周围的环（将这些环视为输入要素周围的环或圆环）。最小的缓冲区将覆盖其输入特征的面积加上缓冲区距离，后续缓冲区将是围绕最小缓冲区的环，这些缓冲区不覆盖输入特征或较小缓冲区的面积。相同距离的所有缓冲区将溶解为单个要素。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>重叠（磁盘）- 缓冲区不会被溶解。无论是否重叠，都将保留所有缓冲区。每个缓冲区将覆盖其输入特征以及任何较小缓冲区的面积。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Dissolve Option")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _Dissolve_Option_value _Dissolve_Option { get; set; } = _Dissolve_Option_value._ALL;

        public enum _Dissolve_Option_value
        {
            /// <summary>
            /// <para>Non-overlapping (rings)</para>
            /// <para>Non-overlapping (rings)—Buffers will be dissolved to resemble rings around the input features that do not overlap (think of these as rings or donuts around the input features). The smallest buffer will cover the area of its input feature plus the buffer distance, and subsequent buffers will be rings around the smallest buffer that do not cover the area of the input feature or smaller buffers. All buffers of the same distance will be dissolved into a single feature. This is the default.</para>
            /// <para>非重叠（环）—缓冲区将被溶解为类似于不重叠的输入要素周围的环（将这些环视为输入要素周围的环或圆环）。最小的缓冲区将覆盖其输入特征的面积加上缓冲区距离，后续缓冲区将是围绕最小缓冲区的环，这些缓冲区不覆盖输入特征或较小缓冲区的面积。相同距离的所有缓冲区将溶解为单个要素。这是默认设置。</para>
            /// </summary>
            [Description("Non-overlapping (rings)")]
            [GPEnumValue("ALL")]
            _ALL,

            /// <summary>
            /// <para>Overlapping (disks)</para>
            /// <para>Overlapping (disks)—Buffers will not be dissolved. All buffer areas will be maintained regardless of overlap. Each buffer will cover its input feature plus the area of any smaller buffers.</para>
            /// <para>重叠（磁盘）- 缓冲区不会被溶解。无论是否重叠，都将保留所有缓冲区。每个缓冲区将覆盖其输入特征以及任何较小缓冲区的面积。</para>
            /// </summary>
            [Description("Overlapping (disks)")]
            [GPEnumValue("NONE")]
            _NONE,

        }

        /// <summary>
        /// <para>Outside Polygons Only</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the buffers will cover the input features. This parameter is valid only for polygon input features.</para>
        ///   <para>
        ///     <bulletList>
        ///       <bullet_item>Unchecked—Buffers will overlap or cover the input features. This is the default.</bullet_item><para/>
        ///       <bullet_item>Checked—Buffers will be rings around the input features, and will not overlap or cover the input features (the area inside the input polygon will be erased from the buffer).</bullet_item><para/>
        ///     </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定缓冲区是否将覆盖输入要素。此参数仅对面输入要素有效。</para>
        ///   <para>
        ///     <bulletList>
        ///       <bullet_item>未选中 - 缓冲区将重叠或覆盖输入要素。这是默认设置。</bullet_item><para/>
        ///       <bullet_item>选中 - 缓冲区将是围绕输入要素的环，不会重叠或覆盖输入要素（输入面内的区域将从缓冲区中擦除）。</bullet_item><para/>
        ///     </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Outside Polygons Only")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _Outside_Polygons_Only_value _Outside_Polygons_Only { get; set; } = _Outside_Polygons_Only_value._false;

        public enum _Outside_Polygons_Only_value
        {
            /// <summary>
            /// <para>OUTSIDE_ONLY</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("OUTSIDE_ONLY")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>FULL</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("FULL")]
            [GPEnumValue("false")]
            _false,

        }

        public MultipleRingBuffer SetEnv(object MResolution = null, object MTolerance = null, object XYDomain = null, object XYResolution = null, object XYTolerance = null, object ZResolution = null, object ZTolerance = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object outputMFlag = null, object outputZFlag = null, object outputZValue = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(MResolution: MResolution, MTolerance: MTolerance, XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, ZResolution: ZResolution, ZTolerance: ZTolerance, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, outputMFlag: outputMFlag, outputZFlag: outputZFlag, outputZValue: outputZValue, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}